package gorminit

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

//配置
type GormConfig struct {
	SingularTable bool
	SlowThreshold int
	Dsn string
	Prefix string
	SetMaxIdleConns int
	SetMaxOpenConns int
	SetConnMaxLifetime int
	LogOutLevel int
}

// 获取一个 mysql 客户端
func InitGorm(config GormConfig) (*gorm.DB, error) {
	var dbDialector gorm.Dialector
	dbDialector = mysql.Open(config.Dsn)
	gormDb, err := gorm.Open(dbDialector, &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix: config.Prefix,   // 表名前缀，`User` 的表名应该是 `t_users`
			SingularTable: config.SingularTable, // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `t_user`
		},
		SkipDefaultTransaction: true,
		PrepareStmt:            true,
		Logger:                 gormLogLevel(config.LogOutLevel, config.SlowThreshold), //拦截、接管 gorm v2 自带日志
	})
	if err != nil {
		//gorm 数据库驱动初始化失败
		return nil, err
	}

	// 为主连接设置连接池(43行返回的数据库驱动指针)
	if rawDb, err := gormDb.DB(); err != nil {
		return nil, err
	} else {
		//rawDb.SetConnMaxIdleTime(time.Second * 30)
		lifetime := time.Duration(config.SetConnMaxLifetime) * time.Second
		rawDb.SetConnMaxLifetime(lifetime)
		rawDb.SetMaxIdleConns(config.SetMaxIdleConns)
		rawDb.SetMaxOpenConns(config.SetMaxOpenConns)
		return gormDb, nil
	}
}